package auth

import (
	"x-admin/backend/pkg/response"

	"github.com/gin-gonic/gin"
)

// Handler 认证处理器
type Handler struct {
	service Service
}

// NewHandler 创建认证处理器
func NewHandler(service Service) *Handler {
	return &Handler{
		service: service,
	}
}

// Login 用户登录
// @Summary 用户登录
// @Description 用户登录获取访问令牌
// @Tags 认证管理
// @Accept json
// @Produce json
// @Param login body LoginRequest true "登录信息"
// @Success 200 {object} response.Response{data=LoginResponse} "登录成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 401 {object} response.Response "用户名或密码错误"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Router /auth/login [post]
func (h *Handler) Login(c *gin.Context) {
	var req LoginRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	loginResp, err := h.service.Login(&req)
	if err != nil {
		if err.Error() == "用户名或密码错误" || err.Error() == "用户已被禁用" {
			response.Unauthorized(c, err.Error())
			return
		}
		response.InternalServerError(c, "登录失败: "+err.Error())
		return
	}

	response.SuccessWithMessage(c, "登录成功", loginResp)
}

// Logout 用户登出
// @Summary 用户登出
// @Description 用户登出，清除令牌
// @Tags 认证管理
// @Accept json
// @Produce json
// @Success 200 {object} response.Response "登出成功"
// @Failure 401 {object} response.Response "未授权"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /auth/logout [post]
func (h *Handler) Logout(c *gin.Context) {
	userID, exists := c.Get("user_id")
	if !exists {
		response.Unauthorized(c, "未授权")
		return
	}

	if err := h.service.Logout(userID.(uint)); err != nil {
		response.InternalServerError(c, "登出失败: "+err.Error())
		return
	}

	response.SuccessWithMessage(c, "登出成功", nil)
}

// GetUserInfo 获取当前用户信息
// @Summary 获取用户信息
// @Description 获取当前登录用户的详细信息
// @Tags 认证管理
// @Accept json
// @Produce json
// @Success 200 {object} response.Response{data=UserInfo} "获取成功"
// @Failure 401 {object} response.Response "未授权"
// @Failure 404 {object} response.Response "用户不存在"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /auth/userinfo [get]
func (h *Handler) GetUserInfo(c *gin.Context) {
	userID, exists := c.Get("user_id")
	if !exists {
		response.Unauthorized(c, "未授权")
		return
	}

	userInfo, err := h.service.GetUserInfo(userID.(uint))
	if err != nil {
		if err.Error() == "用户不存在" {
			response.NotFound(c, err.Error())
			return
		}
		response.InternalServerError(c, "获取用户信息失败: "+err.Error())
		return
	}

	response.Success(c, userInfo)
}

// ChangePassword 修改密码
// @Summary 修改密码
// @Description 修改当前用户的登录密码
// @Tags 认证管理
// @Accept json
// @Produce json
// @Param password body ChangePasswordRequest true "密码信息"
// @Success 200 {object} response.Response "修改成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 401 {object} response.Response "未授权或原密码错误"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /auth/change-password [post]
func (h *Handler) ChangePassword(c *gin.Context) {
	userID, exists := c.Get("user_id")
	if !exists {
		response.Unauthorized(c, "未授权")
		return
	}

	var req ChangePasswordRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	if err := h.service.ChangePassword(userID.(uint), &req); err != nil {

		response.HandleError(c, err)
		return
	}

	response.SuccessWithMessage(c, "密码修改成功", nil)
}

// UpdateProfile 更新个人信息
// @Summary 更新个人信息
// @Description 更新当前用户的个人信息
// @Tags 认证管理
// @Accept json
// @Produce json
// @Param profile body UpdateProfileRequest true "个人信息"
// @Success 200 {object} response.Response{data=UserInfo} "更新成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 401 {object} response.Response "未授权"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /auth/profile [put]
func (h *Handler) UpdateProfile(c *gin.Context) {
	userID, exists := c.Get("user_id")
	if !exists {
		response.Unauthorized(c, "未授权")
		return
	}

	var req UpdateProfileRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	userInfo, err := h.service.UpdateProfile(userID.(uint), &req)
	if err != nil {
		if err.Error() == "邮箱已被使用" {
			response.BadRequest(c, err.Error())
			return
		}
		response.InternalServerError(c, "更新失败: "+err.Error())
		return
	}

	response.SuccessWithMessage(c, "更新成功", userInfo)
}

// GetUserMenus 获取用户菜单
// @Summary 获取用户菜单
// @Description 超级管理员返回所有菜单，普通用户返回角色分配的菜单
// @Tags 认证管理
// @Accept json
// @Produce json
// @Success 200 {object} response.Response{data=[]MenuInfo} "获取成功"
// @Failure 401 {object} response.Response "未授权"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /auth/menus [get]
func (h *Handler) GetUserMenus(c *gin.Context) {
	userID, exists := c.Get("user_id")
	if !exists {
		response.Unauthorized(c, "未授权")
		return
	}

	menus, err := h.service.GetUserMenus(userID.(uint))
	if err != nil {
		response.InternalServerError(c, "获取菜单失败: "+err.Error())
		return
	}

	response.Success(c, menus)
}

// GetUserPermissions 获取用户权限
// @Summary 获取用户权限
// @Description 超级管理员返回所有权限，普通用户返回角色分配的权限
// @Tags 认证管理
// @Accept json
// @Produce json
// @Success 200 {object} response.Response{data=[]string} "获取成功"
// @Failure 401 {object} response.Response "未授权"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /auth/permissions [get]
func (h *Handler) GetUserPermissions(c *gin.Context) {
	userID, exists := c.Get("user_id")
	if !exists {
		response.Unauthorized(c, "未授权")
		return
	}

	permissions, err := h.service.GetUserPermissions(userID.(uint))
	if err != nil {
		response.InternalServerError(c, "获取权限失败: "+err.Error())
		return
	}

	response.Success(c, permissions)
}
